package com.springboot.aop.config;

import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class AopConfig {

    private Logger logger = LoggerFactory.getLogger(AopConfig.class);
    /**
     * 定义切入点，切入点为com.example.demo.aop.AopController中的所有函数
     * 通过@Pointcut注解声明频繁使用的切点表达式
     */
    @Pointcut("execution(public * com.springboot.aop.controller.AopController.*(..)))")
    public void BrokerAspect(){
    }

    /**
     *  在连接点执行之前执行
     */
    @Before("BrokerAspect()")
    public void doBefore(){
        logger.info("Before: 进入test1方法之前");
    }

    /**
     * 在连接点执行之后执行（返回通知和异常通知的异常）
     */
    @After("BrokerAspect()")
    public void doAfter(){
        logger.info("After： 退出test1方法之后");
    }

    /**
     * 在连接点执行之后执行的通知（返回通知）
     */
    @AfterReturning("BrokerAspect()")
    public void doAfterReturning(){
        logger.info("AfterReturning: 返回通知");
    }

    /**
     * 在连接点执行之后执行的通知（异常通知）
     */
    @AfterThrowing("BrokerAspect()")
    public void doAfterThrowing(){
        logger.info("AfterThrowing: 异常通知");
    }
}
